//
// Created by longPc on 2024/5/4.
//

#ifndef BASIC_OPENGLWIDGET13_H
#define BASIC_OPENGLWIDGET13_H



#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
#include <QTimer>
#include <QOpenGLTexture>

/// 问题：opengl中纹理坐标设置[2.0, -1]图像就变小了出现环绕，为什么明明设置了超过[1,1]，看起来是图像缩小了呢
/// 答案：
/// 这是因为在OpenGL中，超出的UV坐标值并不会增加纹理的尺寸，它只是告诉OpenGL在纹理坐标轴上重复你的纹理。当你使用大于1的坐标值时，例如[2.0, -1]，
/// 你其实是在告诉OpenGL你想在同样的区域里对你的纹理进行多次映射，也就是重复。
/// 这就好比你用一张明信片大小的图片来装饰一面墙，你的选项是把明信片图案重复多次，填满整个墙面。不论你想将这个图案重复多少次，明信片（纹理）本身的大小是不会改变的，
/// 只是重复的次数更多，所以每个图案看起来就会更小。只有这样，原本单张明信片大小的图案才能填充整面墙。
/// 换句话说，结束坐标或纹理坐标超过1并不会放大纹理，相反，它会使纹理在同等的空间内重复出现，就会造成纹理看起来像缩小了。这就是你认为纹理被缩小的原因。
class OpenGLWidget13 : public QOpenGLWidget, QOpenGLFunctions_3_3_Core {
Q_OBJECT
public:
    enum Shape {
        None, Rect, Circle, Triangle
    };

    explicit OpenGLWidget13(QWidget *parent = nullptr);

    ~OpenGLWidget13() override;

    /// 绘制图形
    void drawShape(Shape shape);

    void wrieframeMode(bool mode);

protected:
    void initializeGL() override; ///< QOpenGLWidget的需要实现的函数
    void resizeGL(int w, int h) override; ///< QOpenGLWidget的需要实现的函数
    void paintGL() override; ///< QOpenGLWidget的需要实现的函数


public slots:

private:
    Shape m_shape;
    /// 链接着色器的对象
    QOpenGLShaderProgram m_shaderProgram;
    /// 定时器
    QTimer m_timer;
    /// 纹理对象
    QOpenGLTexture *p_texture0;
    /// 纹理2
    QOpenGLTexture *p_texture1;
    /// 纹理3 - 测试环绕模式
    QOpenGLTexture *p_texture2;
};;

#endif //BASIC_OPENGLWIDGET13_H
